package com.ldzy.webase.controller;

import com.auth0.jwt.JWT;
import com.ldzy.webase.annotation.PassToken;
import com.ldzy.webase.annotation.UserLoginToken;
import com.ldzy.webase.entity.Consult;
import com.ldzy.webase.entity.Notice;
import com.ldzy.webase.service.NoticeService;
import com.ldzy.webase.utils.Response;
import com.ldzy.webase.utils.ResponseCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RestController
@ResponseBody
@RequestMapping("/notice")
public class NoticeController {
    @Autowired
    NoticeService noticeService;

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:17
     * @description ：根据学生uid查询用户需要接收的所有通知-有联合索引[noticeRelationId和uid组成联合索引]
     * 1. not in查询，根据学生id查询t_notice_relation表里是否有包含对应noticeId的通知，包含且已经删除则不予发送
     * 2. 如果用户注册时间大于通知时间则不予发送
     * 3. 如果t_notice_relation表里的通知记录已被删除则不予发送
     */
    @GetMapping("/list")
    @UserLoginToken
    public Response getAllNoticeByUid(HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 获取用户所有还未接收、还未清空的通知
        List<Notice> noticeList = noticeService.getAllNoticeByUid(uid);

        // 将 数据 返回给前端
        return Response.build(ResponseCode.SUCCESS, noticeList);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:17
     * @description ：当用户点击阅读消息之后，直接根据用户接收的通知noticeId和学生uid添加对应消息记录到t_notice_relation表中，默认设置为已阅读状态[1]
     */
    @PutMapping("/notice/read")
    @UserLoginToken
    public Response addNoticeRelation(@RequestParam("noticeId") Integer noticeId, HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 添加对应消息记录到t_notice_relation表中
        noticeService.addNoticeRelation(noticeId, uid);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }

    /**
     * @author ：Lq
     * @date ：2022/11/20 11:21
     * @description ：当用户点击删除/清空消息时，根据noticeId和uid将isDelete字段修改为1
     */
    @DeleteMapping("/notice/delete/{noticeId}")
    @UserLoginToken
    public Response editNoticeRelation(@PathVariable("noticeId") Integer noticeId, HttpServletRequest httpServletRequest) {
        // 从请求头中取出token
        String token = httpServletRequest.getHeader("Authorization");
        // 从token中取出的uid，不需要担心是否为null，因为@UserLoginToken注解已经验证过了
        int uid = Integer.parseInt(JWT.decode(token).getAudience().get(0));

        // 将isDelete字段修改为1
        noticeService.editNoticeRelation(noticeId, uid);

        // 返回成功消息给前端
        return Response.build(ResponseCode.SUCCESS);
    }
}
